Matrix Generator

The Matrix generator combines the parameters generated by two child generators, iterating through every combination of each generator’s generated parameters.

By combining both generators parameters, to produce every possible combination, this allows you to gain the intrinsic properties of both generators. For example, a small subset of the many possible use cases include:

  • SCM Provider Generator + Cluster Generator: Scanning the repositories of a GitHub organization for application resources, and targeting those resources to all available clusters.
  • Git File Generator + List Generator: Providing a list of applications to deploy via configuration files, with optional configuration options, and deploying them to a fixed list of clusters.
  • Git Directory Generator + Cluster Decision Resource Generator: Locate application resources contained within folders of a Git repository, and deploy them to a list of clusters provided via an external custom resource.
  • And so on…

Any set of generators may be used, with the combined values of those generators inserted into the template parameters, as usual.

Example: Git Directory generator + Cluster generator

As an example, imagine that we have two clusters:

  • A staging cluster (at https://1.2.3.4)
  • A production cluster (at https://2.4.6.8)

And our application YAMLs are defined in a Git repository:

  • Argo Workflows controller (examples/git-generator-directory/cluster-addons/argo-workflows)
  • Prometheus operator (/examples/git-generator-directory/cluster-addons/prometheus-operator)

Our goal is to deploy both applications onto both clusters, and, more generally, in the future to automatically deploy new applications in the Git repository, and to new clusters defined within Argo CD, as well.

For this we will use the Matrix generator, with the Git and the Cluster as child generators:

  1. apiVersion: argoproj.io/v1alpha1
  2. kind: ApplicationSet
  3. metadata:
  4. name: cluster-git
  5. spec:
  6. generators:
  7. # matrix 'parent' generator
  8. - matrix:
  9. generators:
  10. # git generator, 'child' #1
  11. - git:
  12. repoURL: https://github.com/argoproj/argo-cd.git
  13. revision: HEAD
  14. directories:
  15. - path: applicationset/examples/matrix/cluster-addons/*
  16. # cluster generator, 'child' #2
  17. - clusters:
  18. selector:
  19. matchLabels:
  20. argocd.argoproj.io/secret-type: cluster
  21. template:
  22. metadata:
  23. name: '{{path.basename}}-{{name}}'
  24. spec:
  25. project: '{{metadata.labels.environment}}'
  26. source:
  27. repoURL: https://github.com/argoproj/argo-cd.git
  28. targetRevision: HEAD
  29. path: '{{path}}'
  30. destination:
  31. server: '{{server}}'
  32. namespace: '{{path.basename}}'

First, the Git directory generator will scan the Git repository, discovering directories under the specified path. It discovers the argo-workflows and prometheus-operator applications, and produces two corresponding sets of parameters:

  1. - path: /examples/git-generator-directory/cluster-addons/argo-workflows
  2. path.basename: argo-workflows
  3. - path: /examples/git-generator-directory/cluster-addons/prometheus-operator
  4. path.basename: prometheus-operator

Next, the Cluster generator scans the set of clusters defined in Argo CD, finds the staging and production cluster secrets, and produce two corresponding sets of parameters:

  1. - name: staging
  2. server: https://1.2.3.4
  3. - name: production
  4. server: https://2.4.6.8

Finally, the Matrix generator will combine both sets of outputs, and produce:

  1. - name: staging
  2. server: https://1.2.3.4
  3. path: /examples/git-generator-directory/cluster-addons/argo-workflows
  4. path.basename: argo-workflows
  5. - name: staging
  6. server: https://1.2.3.4
  7. path: /examples/git-generator-directory/cluster-addons/prometheus-operator
  8. path.basename: prometheus-operator
  9. - name: production
  10. server: https://2.4.6.8
  11. path: /examples/git-generator-directory/cluster-addons/argo-workflows
  12. path.basename: argo-workflows
  13. - name: production
  14. server: https://2.4.6.8
  15. path: /examples/git-generator-directory/cluster-addons/prometheus-operator
  16. path.basename: prometheus-operator

(The full example can be found here.)

Restrictions

  1. The Matrix generator currently only supports combining the outputs of only two child generators (eg does not support generating combinations for 3 or more).

  2. You should specify only a single generator per array entry, eg this is not valid:

    1. - matrix:
    2. generators:
    3. - list: # (...)
    4. git: # (...)
    • While this will be accepted by Kubernetes API validation, the controller will report an error on generation. Each generator should be specified in a separate array element, as in the examples above.
  3. The Matrix generator does not currently support template overrides specified on child generators, eg this template will not be processed:

    1. - matrix:
    2. generators:
    3. - list:
    4. elements:
    5. - # (...)
    6. template: { } # Not processed
  4. Combination-type generators (matrix or merge) can only be nested once. For example, this will not work:

    1. - matrix:
    2. generators:
    3. - matrix:
    4. generators:
    5. - matrix: # This third level is invalid.
    6. generators:
    7. - list:
    8. elements:
    9. - # (...)